<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 1.call
        // call方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数列表)。
        function foo() {
            console.log(this.name);
        }
        var obj = {
            name: '张三',
            foo: foo
        }
        foo.call(obj); // 张三

        // 2.apply
        // apply方法调用一个函数, 其具有一个指定的this值，以及作为一个数组（或类数组对象）提供的参数。
        function foo() {
            console.log(this.name);
        }
        var obj = {
            name: '张三',
            foo: foo
        }
        foo.apply(obj); // 张三

        // 3.bind
        // bind()方法创建一个新的函数，在调用时设置this关键字为提供的值。并在调用新函数时，在任何提供之前提供一个给定的参数序列。
        function foo() {
            console.log(this.name);
        }
        var obj = {
            name: '张三',
            foo: foo
        }
        var bar = foo.bind(obj);
        bar(); // 张三
        // 总结：call和apply都是调用函数，并且修改函数内部this指向，区别在于传参方式不同，call是参数列表，apply是数组。
        //  bind也是修改this指向，但是不会调用函数，而是创建一个新的函数，需要手动调用。
    </script>
</body>
</html>